import fileinput, time, datetime

def input_dati(nomefile):
	f = file(nomefile,'r')
	time_line = []
	for e in f.readlines():
		time_line.append(e)
	return time_line

def spezza_righe(a_string):
#La funzione prende in input una stringa contenente ora inizio/fine e data inizio/fine riposo
#ritorna i singoli frammenti data inizio/fine e ora inizio/fine
	tipo_servizio = ''	
	data_inizio = ''
	data_fine = ''	
	ora_inizio = ''
	ora_fine = ''
	i = 0
	tipo_servizio = a_string[0:a_string.find(',')]
	a_string = a_string[a_string.find(',')+1:]
	data_inizio = a_string[0:a_string.find(',')]
	a_string = a_string[a_string.find(',')+1:]
	ora_inizio = a_string[0:a_string.find(',')]
	a_string = a_string[a_string.find(',')+1:]
	data_fine = a_string[0:a_string.find(',')]
	a_string = a_string[a_string.find(',')+1:]
	ora_fine = a_string[0:-1]
	return tipo_servizio,data_inizio, ora_inizio, data_fine, ora_fine

def spezza_data(data_string):
  #trasforma la stringa data in giorno,mese,anno.
	giorno = 0 
	mese = 0
	anno = 0
	giorno = data_string[0:data_string.find('/')]
	data_string = data_string[data_string.find('/')+1:]
	mese = data_string[0:data_string.find('/')]
	data_string = data_string[data_string.find('/')+1:]
	anno = data_string[0:]
	return giorno, mese, anno

def spezza_ore(ore_string):
  #trasforma la stringa ore in ore,minuti.
	ora = 0 
	minuti = 0
	if len(ore_string) == 3:#l'ora ha tre caratteri es. 937 
		ora = ore_string[:1]
		minuti = ore_string[1:]
	else:
		ora = ore_string[:2]
		minuti = ore_string[2:]
	return ora,minuti

def string_to_int(string_number):
  #conversione da stringa ad intero

	
	try:
		i = int(string_number)
	except ValueError:
		i = 0
	return i

def calcola_secondi(anno_i, mese_i, giorno_i, ora_i, minuti_i, anno_f, mese_f, giorno_f, ora_f, minuti_f):
#prende i dati caratteristici di un riposo (inizio-fine)
#e ritorna la durata del riposo in secondi 
	data_string_i = [string_to_int(anno_i), string_to_int(mese_i),string_to_int(giorno_i),string_to_int(ora_i),string_to_int(minuti_i),0,0,0,0]
	data_string_f = [string_to_int(anno_f), string_to_int(mese_f),string_to_int(giorno_f),string_to_int(ora_f),string_to_int(minuti_f),0,0,0,0]
	secondi_i = time.mktime(data_string_i)
	giorno_settimana_i, giorno_anno_i = time.gmtime(secondi_i)[6:8]
	secondi_f = time.mktime(data_string_f)
	giorno_settimana_f, giorno_anno_f = time.gmtime(secondi_f)[6:8]
	return secondi_f - secondi_i, giorno_settimana_i, giorno_anno_i, giorno_settimana_f, giorno_anno_f 

def calcola_giorni(anno_i, mese_i, giorno_i, anno_f, mese_f, giorno_f):
#calcola il numero di giorni tra due date
# ritorna il numero di giorni
	data_string_i = [string_to_int(anno_i), string_to_int(mese_i),string_to_int(giorno_i),0,0,0,0,0,0]
	data_string_f = [string_to_int(anno_f), string_to_int(mese_f),string_to_int(giorno_f),0,0,0,0,0,0]
	secondi_i = time.mktime(data_string_i)
	giorno_settimana_i, giorno_anno_i = time.gmtime(secondi_i)[6:8]
	secondi_f = time.mktime(data_string_f)
	giorno_settimana_f, giorno_anno_f = time.gmtime(secondi_f)[6:8]
	return giorno_anno_f - giorno_anno_i

def is_i_t_notte(i_list):
  #True se inizio periodo riposo ricade nella fascia 0.00-6.00, False altrimenti
	secondi_i_t = 0
	secondi_f_t = 0
	secondi_i_r = 0
	inizio_t = [string_to_int(i_list[0]), string_to_int(i_list[1]),string_to_int(i_list[2]),string_to_int('0'),string_to_int('00'),0,0,0,0]
	fine_t = [string_to_int(i_list[0]), string_to_int(i_list[1]),string_to_int(i_list[2]),string_to_int('6'),string_to_int('00'),0,0,0,0]
	inizio_r = [string_to_int(i_list[0]), string_to_int(i_list[1]),string_to_int(i_list[2]),string_to_int(i_list[3]),string_to_int(i_list[4]),0,0,0,0]
	
	secondi_i_t = time.mktime(inizio_t)
	secondi_f_t = time.mktime(fine_t)
	secondi_i_r = time.mktime(inizio_r)
	
	if (secondi_i_r >= secondi_i_t) and (secondi_i_r <= secondi_f_t):
		return True
	return False	

def is_riposo_minimo(ore):
  #True se il riposo e' inferiore a 48 ore
	if ore < 48:
		return True
	return False


def is_sabato_eo_domenica(g_inizio,g_fine):
#verifica se le date input sono comprese tra sabato e/o domenica
#restituisce una coppia di valori true/false rispettivamente per la presenza
#di sabato(T/F) domenica(F/T) o entrambe (F/F) (T/T)
	day_list = []
	sabato = 0 
	domenica = 0
	
	if g_inizio == 5 or g_fine == 5:
	  sabato += 1
	if g_inizio == 6 or g_fine == 6:
	  domenica += 1
	if sabato == 1 and domenica == 1:
		return True,True
	if sabato == 1 and domenica == 0:
		return True,False
	if sabato == 0 and domenica == 1:
		return False,True
	else:
		return False,False
#def catenella(a_list_of_row):
##calcola la catenella di un periodo di [len(a_list_of_row)] giornate
##ritorna la lista con i campi catenella ore e minuti opportunamente valorizzati. 
	#counter = 0 
	#length = len(a_list_of_row) - 1
	

	#while counter < length:
		##print a_list_of_row[counter][0] , length ,counter , '\n'
##se si tratta della prima riga e non siamo in presenza di righe da non conteggiare (riposo R e assenza A)
##catenella_ore = durata_ore e catenella_minuti = durata_minuti
		
		#if (counter == 0) and (a_list_of_row[counter][0] == 'R' or a_list_of_row[counter][0] =='r' or a_list_of_row[counter][0] =='A' or a_list_of_row[counter][0] =='a'):  
##aggiorno il valore di catenella ore e minuti, rispettivamente con durata ore e minuti
			##print 'counter == 0 e riposo' ,counter,  '\n' 
			#counter = counter + 1
			#continue
	      		
		#if (counter > 0) and a_list_of_row[counter][0] == 'R' or a_list_of_row[counter][0] =='r' or a_list_of_row[counter][0] =='A' or a_list_of_row[counter][0] =='a':  
##aggiorno il valore di catenella ore e minuti, rispettivamente con durata ore e minuti
			##print 'counter > 0 e riposo o assenza' ,counter, a_list_of_row[counter][0], '\n'
			#a_list_of_row[counter][7] = a_list_of_row[counter-1][7]
			#a_list_of_row[counter][8] = a_list_of_row[counter-1][8]
			#counter = counter + 1
			#continue
	      		
		#elif counter == 0 and (a_list_of_row[counter][0] != 'R' or a_list_of_row[counter][0] =='r' or a_list_of_row[counter][0] =='A' or a_list_of_row[counter][0] =='a'):
			##print 'counter == 0 e non riposo o assenza' , '\n' 
			#a_list_of_row[counter][7] = a_list_of_row[counter][5]
			#a_list_of_row[counter][8] = a_list_of_row[counter][6]	
			#counter = counter + 1
			#continue
			 
			
	      	

		#if (counter > 1) and a_list_of_row[counter][0] == 'R' or a_list_of_row[counter][0] =='r' or a_list_of_row[counter][0] =='A' or a_list_of_row[counter][0] =='a' :
			##print 'counter > 1 e riposo o assenza' ,counter,  '\n'
			#a_list_of_row[counter][7] = a_list_of_row[counter-1][7]
			#a_list_of_row[counter][8] = a_list_of_row[counter-1][8]	
			#counter = counter + 1
			#continue
			
			
		#if (counter > 1) and (counter <= 6) and a_list_of_row[counter][0] == 'RFR' or a_list_of_row[counter][0] =='rfr' or a_list_of_row[counter][0] =='AR' or a_list_of_row[counter][0] =='ar' or a_list_of_row[counter][0] =='D' or a_list_of_row[counter][0] =='d':
	##i valori che assume catenella sono incrementali dal primo al settimo giorno e non vengono decurtati del valore
	##della settimana precedente, poiche' siamo alla prima settimana
			##print 'counter <= 6 e > 1', counter, '\n'
			#a_list_of_row[counter][7] = a_list_of_row[counter-1][7] + a_list_of_row[counter][5] #aggiorno catenella ore
			#a_list_of_row[counter][8] = a_list_of_row[counter-1][8] + a_list_of_row[counter][6] #aggiorno catenella minuti
			#counter = counter + 1
			#continue
			

		#if (counter > 6) and a_list_of_row[counter][0] == 'RFR' or a_list_of_row[counter][0] =='rfr' or a_list_of_row[counter][0] =='AR' or a_list_of_row[counter][0] =='ar' or a_list_of_row[counter][0] =='D' or a_list_of_row[counter][0] =='d' :
			##print 'counter > 6 e servizio regolare' ,counter,  '\n' 
			#a_list_of_row[counter][7] = a_list_of_row[counter-1][7] + a_list_of_row[counter][5] - a_list_of_row[counter-7][7] #aggiorno catenella ore
			#a_list_of_row[counter][8] = a_list_of_row[counter-1][8] + a_list_of_row[counter][6] - a_list_of_row[counter-7][8] #aggiorno catenella minuti
			#counter = counter + 1
			#continue
			
		#counter = counter + 1
		##print a_list_of_row[counter][0] , length ,counter , '\n'

	#return a_list_of_row

def calcola_range(lista_prestazioni):
#calcola l'intervallo di date inizio e fine del file di input, ritorna inizio e fine.ATTENZIONE il file non deve contenere \n alla fine, pena il mancato funzionamento
#TODO implementare controllo
	j = len(lista_prestazioni)
	inizio = ''
	fine = ''
	t,inizio,oi,df,of = spezza_righe(lista_prestazioni[0])
	t,gi,oi,fine,of = spezza_righe(lista_prestazioni[j-1])  	
	return inizio,fine	

def calcola_giorni(anno_i, mese_i, giorno_i, anno_f, mese_f, giorno_f): 
  """calcola il numero di giorni tra due date ritorna il numero di giorni"""
 
	
  inizio = datetime.datetime(anno_i,mese_i,giorno_i)
  fine  = datetime.datetime(anno_f,mese_f,giorno_f)
  return (fine.__sub__(inizio)).days


def calcola_riposo_giornaliero(giorno_f,ora_f,giorno_i,ora_i):
		"""Calcola il riposo giornaliero previsto da turno per la prestazione lavorativa. La funzione riceve due righe, verranno utilizzate per il calcolo del riposo e per memorizzare il dato calcolato """





	
#Nuova organizzazione dei dati nelle strutture, si predilige l'impiego dei secondi in sostituzione di ore-minuti, si ottiene una riduzione dei campi necessari. Alla struttura dati principale e' cosi' riorganizzata:
# tipo prest.| giorno i| ora i| giorno f| ora f| TODO riposo giornaliero | durata prest.| catenella | riposo| sabato | domenica




	


#******************************************Main script************************************************************************	
giorni_settimana = ['lunedi','martedi','mercoledi','giovedi','venerdi','sabato','domenica']
mesi = ['Gennaio','Febbraio','Marzo','Aprile','Maggio','Giugno','Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'] 
aa = input_dati('turno')
inizio_range, fine_range = calcola_range(aa)
g_inizio_range,m_inizio_range,a_inizio_range = spezza_data(inizio_range)
g_fine_range,m_fine_range,a_fine_range = spezza_data(fine_range)
print calcola_giorni.__doc__
giorni_totali = calcola_giorni(string_to_int(a_inizio_range), string_to_int(m_inizio_range), string_to_int(g_inizio_range), string_to_int(a_fine_range), string_to_int(m_fine_range), string_to_int(g_fine_range) )


ww = 0
monte_ore_riposo = 0
conta_quattordici = 0
conta_dodici = 0
data_output = []
#creo una lista che conterra' l-insieme dei dati del turno, in cui la singola lista contiene un record
#giornaliero formato da: tipo servizio, giorno iniz, ora iniz, giorno fine, ora fine, durata ore, durata minuti
# catenella ore, catenella minuti , interessa sabato, interessa domenica
output_lists = [[] for i in range(giorni_totali)]
#verificare che giorni_totali coincida con la lunghezza del file turno
while ww < len(aa)-1:
	tipo,x,y,z,w =  spezza_righe(aa[ww])
	a,e,j = spezza_data(x)
	o,u = spezza_ore(y)
	test_notte_i = [j,e,a,o,u]
	h,i,l = spezza_data(z)
	#print 'hil',h,i,l
	m,n = spezza_ore(w)
	test_notte_f = [l,i,h,m,n]
	#print 'mn',m,n
	prestazione,d_w_i,d_y_i, d_w_f, d_y_f = calcola_secondi(j,e,a,o,u,l,i,h,m,n)
	monte_ore_riposo = monte_ore_riposo + prestazione
	real_sec = prestazione/3600
	ore = int(real_sec)
	minuti = int((real_sec - int(real_sec) )* 60)
	sabato,domenica = is_sabato_eo_domenica(d_w_i,d_w_f)
	
	#print "|---------------------------------------------------------------------------------------------------------------|"
	#print "|Settimana %d-%d, riposo da %s %s/%s/%s a %s %s/%s/%s , durata %d h %d minuti |" % (d_y_i/7,d_y_f/7,giorni_settimana[d_w_i],a,e,j ,giorni_settimana[d_w_f],h,i,l,ore,minuti)
	#if is_i_t_notte(test_notte_i) and is_i_t_notte(test_notte_f): 
	#	print "|Il riposo non puo terminare in 0.00-6.00 !"
	#if is_riposo_minimo(ore):
	#	print "|Riposo < 48h"
	#if sabato and domenica:
	#	print"|riposo sabato e domenica                                                                                |"
	#elif sabato and (not domenica):
	#	print"|riposo sabato                                                                                           |"
	#elif not sabato and domenica:
	#	print"|riposo domenica                                                                                         |"
	
	#print '|---------------------------------------------------------------------------------------------------------------|'
	if (sabato and domenica)  and ore >= 60:#14 riposi di almeno 60 ore
		conta_quattordici = conta_quattordici + 1
	if (sabato or domenica) and ore >= 48:
		conta_dodici = conta_dodici + 1
	catenella = 0 #sommatoria delle prestazioni lavorative in minuti degli ultimi 7 giorni
	riposo = 0 #totale dei secondi di riposo settimanale
	riposo_giornaliero = 0 #riposo intercorrente tra due servizi AR
	#assegno i dati del record giornaliero alla lista
	output_lists[ww].append(tipo)
	output_lists[ww].append(x) #giorno inizio
	output_lists[ww].append(y) #ora inizio
	output_lists[ww].append(z) #giorno fine
	output_lists[ww].append(w) #ora fine
	output_lists[ww].append(prestazione) #durata prestazione in secondi
	output_lists[ww].append(riposo_giornaliero) #intervallo temporale intercorrente tra due servizi
	output_lists[ww].append(catenella) # catenella in secondi
	output_lists[ww].append(riposo) #riposo settimanale in secondi
	output_lists[ww].append(sabato) #prestazione sabato
	output_lists[ww].append(domenica) #prestazione domenica
	
	ww = ww + 1
	
prr = output_lists
prrr = 0
while prrr < len(prr)-1:
	print prr[prrr]
	prrr = prrr + 1

print "Monte Ore Annuale",int(monte_ore_riposo/3600)
print "I riposi coincidenti con Sabato e Domenica di almeno 60 ore sono:%d" %(conta_quattordici)
print "I riposi coincidenti con Sabato o Domenica di almeno 48 ore sono:%d" %(conta_dodici)


